Accessibility Tools

- Le blog participatif de bioinformatique francophone depuis 2012 -

Command line Tips : passage de variable dans awk

But : Dans un fichier orga­ni­sé en colonnes, nous allons extraire les lignes conte­nant un mot (don­né en argu­ment) dans une colonne fixée à l'avance (1ère colonne).

Pré­re­quis : Connaître un peu le shell (pour l'exercice).

Dif­fi­cul­té : 2/​5 (Facile)

Exer­cice : Pour agré­men­ter la note, on extrai­ra dans quatre fichiers dis­tincts les lignes conte­nant les quatre mots les plus repré­sen­tés du fichier PDB ci-des­sous (un mot, un fichier). On pour­ra nom­mer les fichiers sous la forme "mot.txt".

PDB 6CSC

Dans une note récente, Leo_​01 nous détaillait plu­sieurs moyens d'extraire des colonnes d'un fichier. Je vous encou­rage à lire sa note (sur­tout si vous ne connais­sez pas awk).

awk est un inter­pré­teur et un lan­gage qui per­met d'appliquer un script à des fichiers texte plu­tôt orga­ni­sés en colonnes. Très pra­tique pour des fichiers de tailles rai­son­nables, il ne faut pas trop espé­rer trai­ter plu­sieurs mil­lions de lignes sans un peu d'attente (variable sui­vant la machine bien sûr). Il existe dif­fé­rentes ver­sions de awk, gawk, mawk et nawk (liste pas for­cé­ment exhaus­tive), mais toutes ses ver­sions étant POSIX, elles devraient être dis­po­nibles sur tout sys­tème POSIX et se com­por­ter de manière iden­tique.
La ligne de com­mande clas­sique tel que décrite par le man prend la forme sui­vante :

ou

En géné­ral, j'utilise la pre­mière forme de ligne de com­mande. La deuxième peut avoir un inté­rêt si on veut géné­rer le script de manière "dyna­mique" ou pour une ques­tion de lisi­bi­li­té.
Par­mi les options, la plus impor­tante est pro­ba­ble­ment -F per­met­tant d'indiquer le sépa­ra­teur de champs mais celle qui va nous inté­res­ser aujourd'hui est -v pour variable ; extrait du man :

Exemple sans fichier d'entrée :

Ici, on note­ra l'utilisation du mot clef "BEGIN" qui regroupe des ins­truc­tions qui ne seront exé­cu­tées qu'une seule fois avant la lec­ture du fichier.
La struc­ture d'un script awk prend la forme d'un bloc BEGIN{} (optio­nel), d'un bloc (optio­nel) sans éti­quette sim­ple­ment déli­mi­té par {} qui sera appli­qué à chaque ligne du fichier et pour finir d'un bloc END{} (optio­nel) dont les ins­truc­tions ne seront éxé­cu­tées qu'une seule fois après la fin de la lec­ture du fichier. L'interet des ces blocs se trouve par exemple pour cal­cu­ler la moyenne d'une colonne. On ini­tia­li­se­rait une variable dans un BEGIN, on som­me­rait les valeurs dans le bloc {} puis on affi­che­rait la moyenne dans le bloc END.
Anec­dote : le script le plus com­plet qui ne ferait rien serait donc 'BEGIN{}{}END{}'.
Note : on peut pas­ser plu­sieurs variables en répé­tant l'option "-v".

Nous pou­vons main­te­nant répondre à la ques­tion de départ. Nous allons extraire les lignes dont la pre­mière colonne contient le tag COMPND du fichier PDB.

Comme il faut être fei­gnant, j'aurais écrit

ce qui donne le même résul­tat.

Pour conti­nuer à jouer un peu avec ‑v, on peut aus­si l'utiliser pour choi­sir des colonnes au moment de l'exécution. Pour cela, il suf­fit d'ajouter un "$" devant le nom de la variable :

'{print $var,$var2;}' 6CSC.pdb | head ‑3
HEADER OXO-ACID-LYASE
TITLE CHICKEN
TITLE 2[/crayon]

Comme pré­sen­té dans la note de Leo_​01, nous pour­rions faire un grep pour extraire des lignes, mais ici l'avantage est de pou­voir en plus spé­ci­fier la colonne dans laquelle on cherche le mot.
Voi­la, c'est tout pour cette fois. Je pense que vous êtes prêt à pas­ser à la pra­tique et à résoudre l'exercice en un tour de main. Au pire la solu­tion se trouve plus bas (pas­ser le cur­seur de la sou­ris des­sus pour la voir appa­raitre).

Spoi­ler :

`; do awk ‑v k=$i '($1==k){print;}' 6CSC.pdb &gt ; ${i}.txt ; done[/crayon]

Vous avez aimé ? Dites-le nous !

Moyenne : 0 /​ 5. Nb de votes : 0

Pas encore de vote pour cet article.

Partagez cet article




Commentaires

Une réponse à “Command line Tips : passage de variable dans awk”

  1. trés bon article pour debu­ter avec les clus­ter mer­ci !!!!!

Laisser un commentaire

Pour insérer du code dans vos commentaires, utilisez les balises <code> et <\code>.